package com.wang.study.Proxy;

import com.wang.study.annotation.MyAnnotation;
import com.wang.study.commons.MybatisUtils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkDynamicProxyUtil<T> implements InvocationHandler {


    private T t;


    public T getProxyObject(T real){
        t=real;
        return (T) Proxy.newProxyInstance(real.getClass().getClassLoader(),
                real.getClass().getInterfaces(),this);
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object returnValue=null;
        if (method.isAnnotationPresent(MyAnnotation.class)) {
            //真实对象的某个方法的方法对象上如果有对应的注解，则进行事务处理
            try {
                returnValue=method.invoke(t,args);
                MybatisUtils.getSqlSession().commit();
                System.out.println("if commiting...");
            } catch (Exception e) {
                e.printStackTrace();
                MybatisUtils.getSqlSession().rollback();
            }finally {
//                MybatisUtils.close();
            }
        }else {//没有对应的注解，则不进行事务处理
            returnValue=method.invoke(t,args);
//            MybatisUtils.getSqlSession().commit();
            System.out.println("else commiting...");
        }
        return returnValue;
    }
}
